package middleware

import (
	"fmt"
	"gin-epg/internal/app/common/util"
	"github.com/gin-gonic/gin"
	"net/http"
	"strings"
)

// TokenMiddleware 是一个用于校验 token 的中间件
func TokenMiddleware() gin.HandlerFunc {
	return func(c *gin.Context) {
		var token string

		// 尝试从 Authorization 请求头获取 token
		authHeader := c.GetHeader("Authorization")
		if authHeader != "" {
			// 按空格分割
			parts := strings.SplitN(authHeader, " ", 2)
			if len(parts) == 2 && parts[0] == "Bearer" {
				token = parts[1]
			} else {
				c.JSON(http.StatusBadRequest, gin.H{
					"code": 2004,
					"msg":  "请求头中auth格式有误",
				})
				c.Abort()
				return
			}
		} else {
			// 如果 Authorization 头不存在，尝试从 token 请求头获取 token
			token = c.GetHeader("token")
			if token == "" {
				c.JSON(http.StatusUnauthorized, gin.H{"error": "未提供 token"})
				c.Abort()
				return
			}
		}

		// 使用解析JWT的函数来解析 token
		claims, err := ParseToken(token)
		if err != nil {
			c.JSON(http.StatusUnauthorized, gin.H{
				"code": 2005,
				"msg":  "无效的Token",
			})
			c.Abort()
			return
		}

		// 将用户信息设置到请求上下文中
		c.Set("id", claims["id"])
		c.Set("username", claims["username"])
		c.Set("role", claims["role"])
		c.Set("avatarUrl", claims["avatarUrl"])
		c.Next() // 后续的处理函数可以通过c.Get("username")等来获取当前请求的用户信息
	}
}

// ParseToken 解析token并返回用户信息
func ParseToken(s string) (map[string]interface{}, error) {
	// 拼接 fileDownloadUrl 和 filePath
	addr := "localhost:3051"
	configAddr, err := util.GetConfigValue("leveldbRpcUrl")
	if err == nil {
		addr = configAddr.(string) // 进行类型断言
	}
	operator, err := NewLeveldbSimpleTokenOperator(addr)
	if err != nil {
		return nil, err
	}
	claims, err := operator.getUserMapFromToken(s)
	if err != nil {
		return nil, err
	}
	return claims, nil
}

// GenerateToken 生成Token
func GenerateToken(userMap map[string]interface{}) (string, error) {
	// 获取配置中的地址
	addr := "localhost:3051"
	configAddr, err := util.GetConfigValue("leveldbRpcUrl")
	if err == nil {
		addr = configAddr.(string) // 进行类型断言
	}

	// 创建LevelDB Token操作器
	operator, err := NewLeveldbSimpleTokenOperator(addr)
	if err != nil {
		return "", fmt.Errorf("failed to create LevelDB token operator: %w", err)
	}

	// 生成Token
	claims, err := operator.generateToken(userMap)
	if err != nil {
		return "", fmt.Errorf("failed to generate token: %w", err)
	}

	return claims, nil
}

// 删除token
func DeleteToken(token string) error {
	// 获取配置中的地址
	addr := "localhost:3051"
	configAddr, err := util.GetConfigValue("leveldbRpcUrl")
	if err == nil {
		addr = configAddr.(string) // 进行类型断言
	}
	operator, err := NewLeveldbSimpleTokenOperator(addr)
	if err != nil {
		return fmt.Errorf("failed to create LevelDB token operator: %w", err)
	}
	return operator.deleteToken(token)

}
